package com.nwork.qingmanhua.utils;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

/**
 * 使用的时候，只需要传入从网络获取的 byte 数组
 * 例如异步任务中：byte[] bytes = EntityUtils.toByteArray(entity);
 * Created by LGH on 2015/3/20.
 */
public class SecondBitmapUtils {
    /**
     * 对图片进行二次采样
     * @param bytes
     * @return
     */
    public Bitmap getBitmap( byte[] bytes) {
        Bitmap bitmap = null;
        // 利用图片二次采样，进行内存占用减少的优化
        // 1.第一次采样，根据指定的图片解码参数，进行图片的解码
        BitmapFactory.Options opts = new BitmapFactory.Options();
        // 解码后图片资源是否可以被清除
        opts.inPurgeable = true;
        // 是否只进行图片尺寸的解码，不进行实际的图片解码，BitmapFactory.decodeXXX方法不返回Bitmap，仅更新Options中图片宽度、高度信息
        opts.inJustDecodeBounds = true;
        bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);

        // 2.第二次采样，需要设置 inJustDecodeBounds 为 false
        opts.inJustDecodeBounds = false;
        // 3.计算图片缩放比率  这个整数代表，解码出来的图片是原始图片每一个边的 1/n （n = inSampleSize >= 1）
        opts.inSampleSize = calcSampleSize(opts.outWidth, opts.outHeight, 120, 120);
        bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length,opts);
        return bitmap;
    }

    /**
     * 计算图片采样率
     *
     * @param origWidth  原始宽度
     * @param origHeight 原始高度
     * @param reqWidth   缩放宽度
     * @param reqHeight  缩放高度
     * @return
     */
    private static int calcSampleSize(
            int origWidth, int origHeight,
            int reqWidth, int reqHeight
    ) {

        // 1. 将原始宽度、高度 除以2 ，来计算 sampleSize 从2开始的数值
        //    当宽度、高度除以2之后，实际上计算的就是 1/4 的面积，看看请求的尺寸
        //    是否在1/4内部，如果在内部，那么 sampleSize 至少 可以为2

        int halfWidth = origWidth / 2;
        int halfHeight = origHeight / 2;

        int sampleSize = 1;

        boolean isWidthInner = false;
        boolean isHeightInner = false;
        do {
            // 判断请求的width是否在经过采样率计算的尺寸之内
            isWidthInner = (halfWidth / sampleSize) > reqWidth;
            // 判断请求的Height是否在经过采样率计算的尺寸之内
            isHeightInner = (halfHeight / sampleSize) > reqHeight;

            if (isWidthInner && isHeightInner) {
                sampleSize *= 2;
            }
            // 只要宽高都在内部，那么就继续计算
            // 只要有任何一个尺寸超出，那么就结束计算
        } while (isWidthInner && isHeightInner);


        return sampleSize;
    }
}
